package com.billdowney.service.interfaces.system.quartz;

import java.util.List;

import org.quartz.JobKey;
import org.quartz.ScheduleBuilder;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.springframework.boot.autoconfigure.quartz.QuartzProperties;

import com.billdowney.entity.system.log.SystemLog;
import com.billdowney.service.interfaces.base.BaseService;
import com.billdowney.vo.system.quartz.JobDetailInfoVO;
import com.billdowney.vo.system.quartz.JobTriggerInfoVO;

/**
 * quartz定时任务管理接口
 * 
 * @author 超级小富翁 - BillDowney
 * @date 2019年9月5日 上午11:01:57
 */
public interface QuartzManageService extends BaseService<SystemLog> {

	/**
	 * 获取Quartz的所有配置信息
	 * 
	 * @return
	 * @author 超级小富翁
	 * @date 2019年9月5日 下午9:00:16
	 */
	QuartzProperties getQuartzProperties();

	/**
	 * 获取所有实现的Job {@link org.quartz.Job} 类
	 * 
	 * @return 获取到的相关信息
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年9月5日 下午2:44:21
	 */
	List<JobDetailInfoVO> getAllJobClass();

	/**
	 * 根据jobkey获取作业详情
	 * 
	 * @param jobKey 作业的唯一标识
	 * @return {@link JobDetailInfoVO}
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年9月6日 下午3:58:29
	 */
	JobDetailInfoVO getJobDetailInfo(JobKey jobKey);

	/**
	 * 获取调度器中所有的作业列表
	 * 
	 * @return 获取到的作业详情
	 * @author 超级小富翁
	 * @date 2019年9月5日 下午7:45:44
	 */
	List<JobDetailInfoVO> getSchedulerJobDetailList();

	/**
	 * 获取所有作业的触发器
	 * 
	 * @param jobKey JobDetail的唯一标识
	 * @return 获取到的触发器详情
	 * @author 超级小富翁
	 * @date 2019年9月5日 下午9:09:14
	 */
	List<JobTriggerInfoVO> getJobTriggerList(JobKey jobKey);

	/**
	 * 持久化一个作业到调度器中，具有相同名称的作业已经存在，并且replace为false会抛出异常
	 * 
	 * @param infoVO  需要持久化的作业
	 * @param replace 是否替换现有作业
	 * @return 作业详情
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年9月6日 上午10:54:20
	 */
	JobDetailInfoVO addJob(JobDetailInfoVO infoVO, boolean replace);

	/**
	 * 暂停作业的所有触发器
	 * 
	 * @param jobKey 作业唯一标识
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年9月9日 上午10:14:36
	 */
	void pauseJob(JobKey jobKey);

	/**
	 * 删除作业和其所有触发器，会先暂停所有触发器
	 * 
	 * @param jobKey 作业唯一标识
	 * @throws SchedulerException
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年9月9日 上午10:22:41
	 */
	boolean deleteJob(JobKey jobKey);

	/**
	 * 暂停触发器
	 * 
	 * @param triggerKey 触发器的唯一标识
	 * @return 结果
	 * @author 超级小富翁
	 * @date 2019年9月8日 下午11:06:58
	 */
	void pauseTrigger(TriggerKey triggerKey);

	/**
	 * 删除对应的触发器
	 * 
	 * @param triggerKey 触发器的唯一标识
	 * @return 删除结果
	 * @author 超级小富翁
	 * @date 2019年9月8日 下午10:00:51
	 */
	boolean unscheduleJob(TriggerKey triggerKey);

	/**
	 * 使用givenkey恢复(取消暂停)触发器。 如果触发器错过一次或多次触发，则将应用触发器的误触发指令。
	 * 
	 * @param triggerKey 触发器的唯一标识
	 * @author 超级小富翁
	 * @date 2019年9月8日 下午11:38:46
	 */
	void resumeTrigger(TriggerKey triggerKey);

	/**
	 * 添加触发器并与对应的job绑定
	 * 
	 * @param info            需要添加的触发器
	 * @param jobKey          需要绑定的Job
	 * @param scheduleBuilder 触发器的时间生成器
	 * @return 触发器相关信息
	 * @throws SchedulerException
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年9月9日 上午11:51:11
	 */
	JobTriggerInfoVO scheduleJob(JobTriggerInfoVO info, JobKey jobKey, ScheduleBuilder<Trigger> scheduleBuilder);
}
